package lol.clann.minecraft.springboot.api.bukkit.utils;

import org.bukkit.Chunk;
import org.bukkit.entity.Entity;

import java.util.Collection;
import java.util.List;
import java.util.function.Predicate;

/**
 *
 * @author pyz
 * @date 2019/5/27 11:34 PM
 */
public interface ChunkUtils {
    /**
     * 获取对应的nmsChunk对象
     * @param chunk
     * @param <T>
     * @return
     */
    <T> T toNMS(Chunk chunk);

    /**
     * 获取区块内的所有TileEntity
     *
     * @param chunk
     * @param <T>
     * @return 警告:请勿修改返回的集合
     */
    <T> Collection<T> getTileEntities(Chunk chunk);

    /**
     * 高性能的获取区块实体数量,避免拷贝数组
     *
     * @param chunk
     * @return
     */
    int countEntities(Chunk chunk);

    /**
     * 高性能的获取区块实体数量,避免拷贝数组
     *
     * @param chunk
     * @param filter
     * @return
     */
    int countEntities(Chunk chunk, Predicate<Entity> filter);

    /**
     * 高性能的获取区块实体数量,避免拷贝数组
     *
     * @param chunk
     * @param filter 使用nmsEntity进行过滤
     * @return
     */
    int countNMSEntities(Chunk chunk, Predicate<Object> filter);

    /**
     * 返回区块实体的迭代器,没有数组拷贝操作
     *
     * @param chunk
     * @return
     */
    List<Entity> getEntities(Chunk chunk);

    /**
     * 返回区块实体的迭代器,没有数组拷贝操作
     * 可指定过滤器
     *
     * @param chunk
     * @return
     */
    List<Entity> getEntities(Chunk chunk, Predicate<Entity> filter);

    /**
     * 返回区块实体的迭代器,没有数组拷贝操作
     *
     * @param chunk
     * @return
     */
    <T> List<T> getNMSEntities(Chunk chunk);

    /**
     * 返回区块实体的迭代器,没有数组拷贝操作
     * 可指定过滤器
     *
     * @param chunk
     * @return
     */
    <T> List<T> getNMSEntities(Chunk chunk, Predicate filter);


    void collectEntitiy(Chunk chunk, Predicate<Entity> filter, Collection<Entity> conatiner);

    void collectNMSEntitiy(Chunk chunk, Predicate filter, Collection conatiner);
}
